/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package demo.thread;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author VANDH
 */
public class JPII1208A {

    Exception e;

    // Tính giá trị của phần tử fibonacci thứ n
    public static int getFibo(int n) {
        if (n <= 1) {
            return n;
        }

        int f1 = 0, f2 = 1, f = 1;
        for (int i = 2; i <= n; i++) {
            // tính phần tử thứ i
            f = f1 + f2;
            f1 = f2;
            f2 = f;

            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(JPII1208A.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return f;
    }

    // Tìm số nguyên tố thứ n là số chỉ chia hết cho 1 và chính nó
    public static int tinhSNT(int n) {
        int k = 0, sntThuN = 0;

        for (int j = 2; k < n; j++) {
            // kiểm tra j có phải là snt không?
            // snt là biến làm cờ, true thì j là snt
            boolean snt = true;

            for (int i = 2; i <= j - 1; i++) {

                if (j % i == 0) { // dừng lại, tạo một object kiểu con của Exception
                    // ArimeticException
                    snt = false;
                    break;
                }
            }

            if (snt == true) {
                sntThuN = j;
                k++;
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(JPII1208A.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return sntThuN;
    }

    public static int sumOfParts(String s) {
        int total = 0;
        // s = "822842048"
        for (int i = 0; i < s.length(); i++) {
            // lấy chữ số tại vị trí thứ i trong chuỗi s
            char c = s.charAt(i);
            //total = total + (c - 48);
            total += Integer.parseInt(c + "");
            total += Integer.parseInt(String.valueOf(c));
            // tính tổng dồn
        }
        return total;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //System.out.println(sumOfParts("208418711"));
        int n = 5, total = 0;
        try {
            AtomicInteger sleepCount = new AtomicInteger(0);

            TinhSNT sntThread = new TinhSNT();
            sntThread.n = n;
            sntThread.sc = sleepCount;

            TinhFibo fiboThread = new TinhFibo();
            fiboThread.n = n;
            fiboThread.sc = sleepCount;


            sntThread.start();
            fiboThread.start();


            System.out.println("main - finised");

            sntThread.join();
            fiboThread.join();

            total = sntThread.sntThuN + fiboThread.fiboThuN;
            System.out.println("Tổng = " + total);
            System.out.println("Count = " + sntThread.sc + "," + fiboThread.sc + "," + sleepCount);
            System.out.println("IsAlive : "
                    + sntThread.isAlive() + ","
                    + fiboThread.isAlive() + ","
                    + Thread.currentThread().isAlive());
            // NullPointerException
            //System.out.println("F thứ " + n + " = " + );
            // ArithmeticException
            //System.out.println("SNT thứ " + n + " = " +);
        } catch (NullPointerException ex) {
            System.out.println("Thông báo lỗi ở chỗ tính Fibo");
        } catch (ArithmeticException ex) {
            System.out.println("Thông báo lỗi ở chỗ tính SNT");
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            // Các lệnh ở đây luôn được thực hiện dù có lỗi xảy ra hay không
        }
    }

    public static void demoWrapperClass() {
        //        Wrapper class -> gói bọc
//        char c = 'a';
//        Character cc = new Character('c');
//        byte -> 1 byte -> Byte
//        short -> 2 byte; -> Short
//        int -> 4 byte; -> Integer
//        long -> 8 byte; -> Long
//        float -> 4 byte; -> Float
//        double -> 8 byte; -> Double
        Integer i = new Integer(264);
        int innerI = i.intValue();

        Float f = new Float(264.13);
        float innerF = f.floatValue();
        // tương tự có doubleValue(), longValue(),
        // shortValue(), byteValue()

        // Chuyển giá trị bên trong thành chuỗi
        System.out.println(f.toString());
        int j = Integer.valueOf("1234");
        // phương thức static -> [Tên Class].[Tên hàm]
        // tương đương Integer.parseInt("1234");
        float ff = Float.valueOf("1234.5");
        //dhvan85@gmail.com

        Integer a = new Integer(5);
        Integer b = new Integer(6);

        System.out.println(a.compareTo(b));
        // a < b -> trả về -1
        // a == b -> trả về 0
        // a > b -> trả về 1

        // hàm tính mũ 2^3
        Math.pow(2, 3);
        // tính căn bậc 2 của 3
        Math.sqrt(3);

        // đơn vị truyền vô là radian
        Math.sin(30);
        Math.cos(30);
        Math.tan(30);

        // làm tròn
        Math.ceil(32.3);    // tròn lên
        Math.round(32.5);   // tròn giữa
        Math.floor(32.7);   // tròn xuống

        // random -> số thực ngẫu nhiên từ >=0 && < 1
        Math.random();
        // random từ >= 0 && < n
        double r = Math.random() * 10;
        // random một số double từ 11 -> 25
        // quy về 11 + (0 -> 14)
        double rr = 11 + Math.random() * 14;
    }
}